#!C:\work\Python27\python.exe
# -*- coding: utf-8 -*-

##<--- SARVI-validointipalvelu --->##
##<--- Ohjelmalle syötetään xlsx-taulukko. Taulukosta haetaan tietokomponenttien nimet, ja tarkistetaan niiden oikeellisuus --->##
##<--- SPARQL-kyselyllä ontologiasta. Ohjelma luo html-dokumentin, eli validointiraportin, josta näkyy onko kyseistä kenttää --->##
##<--- Ontologiassa vai ei. --->##

#Excel-tiedostojen lukemista varten:
from openpyxl.workbook import Workbook
from openpyxl.reader.excel import load_workbook

#Graafinen käyttöliittymä:
import Tkinter
from Tkinter import *
import tkFileDialog as fd
from ttk import *

#Säikeistetty ajo:
import threading

#Kansioiden ja tiedostojen luomista varten:
import os
import time
import datetime

#SPARQL-kyselyt:
from SPARQLWrapper import SPARQLWrapper, JSON, ASK, POST, GET, N3, XML, SELECT


#Säie suorittamista varten.
class Thread(threading.Thread):
    def __init__(self, command, call_back):
        self._command = command
        self._call_back = call_back
        super(Thread, self).__init__()
       
    def run(self):
        self._command()
        self._call_back()

#Encoodausta varten
reload(sys)
sys.setdefaultencoding(u'utf-8')

varilaskuri = 1

sarake2laskuri = 0
sarake3laskuri = 0
sarake4laskuri = 0
sarake5laskuri = 0
sarake6laskuri = 0
sarake7laskuri = 0
sarake8laskuri = 0
sarake9laskuri = 0
sarake10laskuri = 0

d = None

##ollaantkssa = None

#Itse validointipalvelun suoritus.
def progtest():
    ohjelmaLoppuu = False
    global d
    laskuri = 0
    #Silmukkaa käydään läpi niin kauan kunnes kaikki valitut tiedostot on käyty läpi.
    while(ohjelmaLoppuu == False):
        if(laskuri >= len(d)):
            ohjelmaLoppuu = True
            break

        tiedostopolku = d[laskuri]
        tiedostopolku = tiedostopolku.decode(u'utf-8')

        index = tiedostopolku.rfind(u"/", 0, len(tiedostopolku))
        tiedosto = tiedostopolku[index+1:]
        tiedosto = unicode(tiedosto)

        wb = load_workbook(tiedostopolku)

        tanaan = datetime.date.today() #Tämänhetkinen päiväys

        #luo tarvittaessa uuden "raportit"-kansion uudella päivämäärällä
        if not os.access(u"raportit\\"+str(tanaan), os.F_OK):
            os.makedirs(u"raportit\\"+str(tanaan))

        #luo uuden Validointiraportti-tiedoston juoksevalla numerolla
        numero = 1
        uusiTiedostoOk = False
        while(uusiTiedostoOk == False):
            if(os.path.isfile(u"raportit\\"+str(tanaan)+u"\Validointiraportti_"+tiedosto+u"_"+str(tanaan)+u"_("+str(numero)+u").html") == False):
                handle = open(u"raportit\\"+str(tanaan)+u"\Validointiraportti_"+tiedosto+u"_"+str(tanaan)+u"_("+str(numero)+u").html", u"a")
                uusiTiedostoOk = True
            else:
               numero += 1

        valilehdet(wb, tiedosto, handle)
    
        handle.close() #sulkee tiedoston

        os.startfile(u"raportit\\"+str(tanaan)+u"\Validointiraportti_"+tiedosto+u"_"+str(tanaan)+u"_("+str(numero)+u").html") #käynnistää luodun tiedoston
        laskuri += 1

##Käy läpi välilehtiä
def valilehdet(wb, tiedosto, handle):
    #Aloittaa html-dokumentin:
    htmlLisays = (u"<html>\n"
                  u"<body TOPMARGIN=30 LEFTMARGIN = 20>\n"
                  u"<head>\n"
                  u"<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n"
                  u"<style type='text/css'>\n"
                  u"     table {border-spacing:0px; border-top-style:dotted; border-bottom-style:dotted; border-width:1px; width:100%}\n"
                  u"     td { vertical-align:top; padding-left:5px; padding-right:5px}\n"
                  u"     th { padding:5px}\n"
                  u"     td.contentred { color:red; }\n"
                  u"     td.titlegray { color:gray;}\n"
                  u"     td.title1red { color:red; }\n"
                  u"     td.title3 { font-weight:bold; }\n"
                  u"     font.red{ color:red; }\n"
                  u"     font.gray{ color:gray; }\n"
                  u"     font.blue{ color:blue; }\n"
                  u"     font.h4red{ font-weight:bold; color:red; }\n"
                  u"     h4.red{ color:red; }\n"
                  u"     tr.odd  td {background: #EAEAEA;}\n"
                  u"     tr.headline1  td {background: #FFFFCC;}\n"
                  u"     tr.headline2  th {background: #CCFFCC;}\n"
                  u"</style>\n"
                  u"</head>\n"
                  u"<h1>Validointiraportti</h1>\n"
                  u"<p>Värien selitykset:</p>\n"
                  u"<p><font class='red'>Esimerkkitietokenttä</font> = Ei löytynyt ontologiasta.</p>\n"
                  u"<p>Esimerkkitietokenttä = Löytyy ontologiasta.</p>\n"
                  u"<p><font class='gray'>Esimerkkitietokenttä</font> = Ei etsitä ontologiasta. Asiakirjakohtainen kenttä.</p>\n"
                  u"<p><font class='blue'>Esimerkkitietokenttä</font> = Lisätty raporttiin ontologiasta. Ei löydy sisällöllisestä asiakirjarakenteesta.</p>\n"
                  u"<p><font class='h4red'>Esimerkkivirhe</font> = Tunnistettu virhe. Huom: Ennen taulukkoa!</p>"
                  u"<br></br>\n"
                  )
    validointi(htmlLisays, handle)

    htmlLisays = (u"<p>Tutkittava tiedosto: <b>"+tiedosto+u"</b></p>")
    validointi(htmlLisays, handle)

    stack = []
    valilehti = 0
    valilehtiaYhteensa = len(wb.worksheets)

    global varilaskuri

    #Silmukkaa käydään läpi niin kauan, kunnes kaikki välilehdet on käyty läpi.
    while(valilehti < valilehtiaYhteensa):
        varilaskuri = 1
        
        ws = wb.worksheets[valilehti]

        valilehdenNimi = str(ws)
        valilehdenNimi = valilehdenNimi.decode(u'utf-8')
        index1 = valilehdenNimi.find(u'"', 0, len(valilehdenNimi))
        index2 = valilehdenNimi.rfind(u'"', 0, len(valilehdenNimi))
        valilehdenNimi = valilehdenNimi[index1+1:index2]
        
        if(valilehdenNimi != None):
            valilehdenNimi = valilehdenNimi.capitalize()
            if(len(valilehdenNimi) < 75):
                htmlLisays = (u"</br>\n"
                              u"<p>Välilehti: "+str(valilehti)+u", <b>"+valilehdenNimi+u"</b></p>")
                validointi(htmlLisays, handle)
            else:
                htmlLisays = (u"</br>\n"
                              u"<p>Välilehti: "+str(valilehti)+u", <b>Välilehden nimi on liian pitkä tai kyseessä ei ole välilehden nimi.</b></p>")
                validointi(htmlLisays, handle)
        elif(valilehdenNimi == None):
            htmlLisays = (u"</br>\n"
                          u"<h4 class='red'>Välilehti: "+str(valilehti)+u", Välilehdellä ei ole nimeä. Tarkista onko välilehti tyhjä.</h4>")
            validointi(htmlLisays, handle)

        rivi = ekatarkistus(ws, handle)#Aloitusrivin hakeminen. Palauttaa -1 jos "Asiakirjarakenteet"-saraketta ei löydy.
        if(rivi == -1):
            valilehti += 1
        else:
            htmlLisays = (u"<table>")#Aloittaa html-dokumentissa taulukon.
            validointi(htmlLisays, handle)
            htmlLisays = (u"<tr class='headline2'>\n"
                          u"    <th align='right'>Rivi</th>\n"
                          u"    <th COLSPAN='7' align='left'>Tikesos-määritys</th>\n"
                          u"    <th align='left'>Otsikko</th>\n"
                          u"    <th align='left' nowrap>Tiedon esitysmuoto</th>\n"
                          u"    <th align='left'>Dokumentaatio</th>\n"
                          u"    <th align='left'>Määritelmä</th>\n"
                          u"    <th align='left'>Huomautus</th>\n"
                          u"    <th align='left'>Esimerkki</th>\n"
                          u"    <th align='left'>Koodisto</th>\n"
                          u"    <th align='left'>Toistuva</th>\n"
                          u"    <th align='left'>Pakollinen</th>\n"
                          u"</tr>"
                          )
            validointi(htmlLisays, handle)
            tokatarkistus(rivi, ws, stack, handle) #Oikeiden kenttien hakeminen.
            htmlLisays = (u"</table>") #Lopettaa html-dokumentissa taulukon.
            validointi(htmlLisays, handle)
            valilehti += 1 #Seuraava välilehti.

    #Lopettaa html-dokumentin:
    htmlLisays = (u"</br>\n"
                  u"<p>Dokumentti: <i>"+tiedosto+u"</i> on käyty läpi.</p>\n"
                  u"</br>\n"
                  u"<hr>\n"
                  u"<p>---SARVI---</p>\n"
                  u"</body>\n"
                  u"</html>")
    validointi(htmlLisays, handle)

##Lisää html-koodia tiedostoon rivi kerrallaan.
def validointi(htmlLisays, handle):
    htmlLisays = unicode(htmlLisays)
    validointi = []
    validointi.append(htmlLisays)
    handle.write((u" ".join(validointi))+u"\n")

##Tutkii löytyykö välilehdestä saraketta: "Asiakirjarakenteet". Jos ei löydy, metodi palauttaa arvon -1 ja tekee virheilmoituksen html-raporttiin.
def ekatarkistus(ws, handle):
    valmis = False
    etsittava = u"Roolilistaus"
    ruutu = None
    rivi = 0
    loytyi = False

    while(valmis == False):
        ruutu = ws.cell(row = rivi, column = 0)
        if(ruutu.value == etsittava):
            valmis = True
            loytyi = True
        else:
            if(rivi < 18000):
                rivi += 1
            else:
                valmis = True
    if(loytyi == True):
##        rivi += 1
        return rivi
    else:
        htmlLisays = (u"<h4 class='red'>Välilehdestä ei löytynyt Roolilistaus-nimistä saraketta</h4>")
        validointi(htmlLisays, handle)
        return -1

##Testaa onko annettu rivi tyhjä. Palauttaa True tai False.
def tyhjanRivinHaku(ws, rivi):
    tyhjarivi = True
    sarake = 0
    tiedonesitysmuoto = tiedonEsitysmuotoTarkistus(ws)#Hakee "Tiedon esitysmuoto"-sarakkeen, eli ei käy koko dokumentin leveyttä läpi.
    for sarake in range(0, tiedonesitysmuoto):
        if(ws.cell(row = rivi, column = sarake).value != None):
            tyhjarivi = False
        sarake += 1
    return tyhjarivi

##Etsii taulukosta tarvittavat kentät
def tokatarkistus(rivi, ws, stack, handle):
    sarake = 0
    ruutu = ws.cell(row = rivi, column = sarake)
    lopetus = viimeinenRiviTaulukossa(ws, handle)#Hakee taulukosta viimeisen rivin, josta tietoa haetaan.
    etsittava = u"TK "
    edellinensarake = 0
    stack = []

    #Näitä tekstejä ei tarkisteta ontologiasta:
    ohitettavatLista = [u"€",
                        u"Kyllä/ei",
                        u"kyllä/ei",
                        u"kytkin",
                        u"Kytkin",
                        u"Päivämäärä",
                        u"päivämäärä",
                        u"pvm",
                        u"Pvm",
                        u"teksti",
                        u"Teksti",
                        u"koodi",
                        u"Koodi",
##                        u"koodi ",
##                        u"Koodi ",
                        u"allekirjoitus",
                        u"Allekirjoitus",
                        u"allekirjoitus:",
                        u"Allekirjoitus:",
                        u"Otsikko, vain näyttömuotoon",
                        u"Otsikko",
                        u"Otsikko vain näyttömuotoon",
                        u"otsikko, vain näyttömuotoon",
                        u"otsikko vain näyttömuotoon",
                        u"otsikko, vain näyttömuodossa",
                        u"Otsikko näyttömuotoon",
                        u"Otsikko, näyttömuotoon",
                        u"ei otsikkoa",
                        u"Tyhjä rivi, vain näyttömuotoon",
                        u"tyhjä rivi, vain näyttömuotoon",
                        u"tyhjä rivi vain näyttömuotoon",
                        u"Tyhjä rivi vain näyttömuotoon",
                        u"Tyhjä rivi näyttömuotoon",
                        u"Vain näyttömuotoon",
                        u"Tyhjä rivi",
                        u"tyhjä rivi",
                        u"tyhjä rivi ",
                        u"numero",
                        u"ajanjakso",
                        u"Kysymys",
                        u"Kysymys:",
                        u"kysymys",
                        u"kysymys:",
                        u"Kysymyksiä:",
                        u"Kysymyksiä: ",
                        u"lkm",
                        u"Lkm",
                        u"lukumäärä",
                        u"Maara",
                        u"Prosentti",
                        u"prosentti",
                        u"sähköinen",
                        u"Nimi"
                        ]
    
    otsikkoLista = [u"Otsikko, vain näyttömuotoon",
                    u"Otsikko",
                    u"Otsikko vain näyttömuotoon",
                    u"otsikko, vain näyttömuotoon",
                    u"otsikko vain näyttömuotoon",
                    u"otsikko, vain näyttömuodossa",
                    u"Otsikko näyttömuotoon",
                    u"Otsikko, näyttömuotoon",
                    ]
    tiedesitmuoto = None
    for rivi in range(rivi, lopetus + 1):
        sarake = 0
        while(ws.cell(row = rivi, column = sarake).value == None and sarake < 7):#Käydään riviä läpi sarakkeittain vasemmalta oikealle kunnes
            sarake+=1                                                            #kentästä löytyy jotain tekstiä.
        if(edellinensarake == sarake-2 and tyhjanRivinHaku(ws, rivi) == False):
            htmlLisays = (u"<h4 class='red'>Tarkista sisennys! Sisennyksessä voi olla virhe rivillä: "+str(rivi+1)+u"</h4>")
            validointi(htmlLisays, handle)
        ruutu = ws.cell(row = rivi, column = sarake)
        if(sarake == 0):
            sarake2 = tiedonEsitysmuotoTarkistus(ws)
            ruutu2 = ws.cell(row = rivi, column = sarake2)                       #Jos ollaan sarakkeessa 0, eli A-sarakkeessa, katsotaan
            if(ruutu2.value != None and ruutu2.value.find(etsittava, 0, 4) == 0):#"Tiedon esitysmuoto-kentästä onko siinä kentässä mitään,
##                ruutu = ruutu2                                                   #ja jos on, tarkistetaan vielä onko sen kentän tekstin alussa kirjaimia: "TK ".
                tiedesitmuoto = ruutu2.value
            elif(ruutu2.value != None):                                          #Jos kirjaimet "TK "-löytyvät, otetaan ruudun arvo kyseisestä kentästä.
                ruutu3 = valinPoisto(ruutu2.value)
                if((ruutu3 in ohitettavatLista) == False):              #Jos ruudussa ei ole "TK "-tekstiä, tarkistetaan onko ruudun arvo ohitettavat-listassa.
##                    ruutu = ruutu2                                      #Jos ei ole, otetaan ruudun arvo taas kyseisestä kentästä.
                    tiedesitmuoto = ruutu2.value
                else:
                    ruutu = ruutu
        sarake2 = tiedonEsitysmuotoTarkistus(ws)
        ruutu2 = ws.cell(row = rivi, column = sarake2)
        ruutu3 = valinPoisto(ruutu2.value)
        if((ruutu3 in otsikkoLista) == False):
            for count in range(sarake,edellinensarake + 1):
                if(len(stack) > 0):
                    stack.pop()
        if(len(stack)>0):
            ollaantkssa = stack[len(stack)-1]
        else:
            ollaantkssa = None
##        if((ruutu3 in otsikkoLista) == False):
##            stack.append(ruutu.value)
        if((ruutu3 in otsikkoLista) == False and sarake == 0):
            stack.append(tiedesitmuoto)
        elif((ruutu3 in otsikkoLista) == False and sarake != 0):
            stack.append(ruutu.value)

        etsitaan = ruutu.value
        if((ruutu3 in otsikkoLista) == False):
            mista = ollaantkssa
        else:
            mista = None

        tarkistus = tarkistaTk(etsitaan, mista, ws, rivi, handle, sarake, ohitettavatLista, tiedesitmuoto)#Tarkistetaan löydettyjen kenttien arvo ja lisätään virheet html-dokumenttiin.

        rivi += 1
        if((ruutu3 in otsikkoLista) == False):
            edellinensarake = sarake
        else:
            edellinensarake = edellinensarake

##Tarkistaa tietokentän sisällön rdf-ontologiasta ja luo html-dokumenttia.
def tarkistaTk(etsitaan, mista, ws, rivi, handle, sarake, ohitettavatLista, tiedesitmuoto):
    etsittava = u"TK "
    if(etsitaan != None):
        etsitaan = str(etsitaan)#Muunnetaan kentän sisältö string-muotoon. Esim.2.1.2 => "2.1.2".
        etsitaan = unicode(etsitaan)
        etsitaan = valinPoisto(etsitaan)
    if(tiedesitmuoto != None):
        tiedesitmuoto = str(tiedesitmuoto)#Muunnetaan kentän sisältö string-muotoon. Esim.2.1.2 => "2.1.2".
        tiedesitmuoto = unicode(tiedesitmuoto)
        tiedesitmuoto = valinPoisto(tiedesitmuoto)
    if(mista != None):
        mista = str(mista)
        mista = unicode(mista)
        mista = valinPoisto(mista)
    try:
        #Poistetaan "TK " tekstin alusta.
        if(tiedesitmuoto != None and (type(tiedesitmuoto) is float) == False):
            tiedesitmuoto = tiedesitmuoto.replace(u'TK ', u'', 1)
        if(mista != None and (type(etsitaan) is float) == False):
            mista = mista.replace(u'TK ', u'', 1)
    except AttributeError:
        htmlLisays = (u"<h4 class='red'>Rivillä: "+str(rivi+1)+u", Havaittu virhe muutettaessa 'tiedon esitysmuoto'-kentän arvoa!(kentän arvo - 'TK ')</h4>")
        validointi(htmlLisays, handle)

    kysymysLista = [u"Kysymys",
                    u"Kysymys:",
                    u"kysymys",
                    u"kysymys:",
                    u"Kysymyksiä:",
                    u"Kysymyksiä: "
                    ]

    #varilaskuri kertoo tuleeko html-dokumentin rivi tummennetulla vai ei. Parittomat tummennetaan.
    global varilaskuri
    
    #Sarakelaskurit ovat sitä varten, ettei ohjelma tulosta html-dokumenttiin montaa kertaa samaa virhettä.
    global sarake2laskuri
    global sarake3laskuri
    global sarake4laskuri
    global sarake5laskuri
    global sarake6laskuri
    global sarake7laskuri
    global sarake8laskuri
    global sarake9laskuri
    global sarake10laskuri

    #Seuraavat metodit hakevat oikeat sarakkeet tietyille otsikoille.
    sarake2 = tiedonEsitysmuotoTarkistus(ws)
    if(sarake2 == -1 and sarake2laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Tiedon esitysmuoto'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake2 = 8
        sarake2laskuri += 1
    elif(sarake2 == -1 and sarake2laskuri > 0):
        sarake2 = 8
    ruutu2 = ws.cell(row = rivi, column = sarake2)
    tiedo = ruutu2.value
    if(ruutu2.value != None):
        tiedo = str(tiedo)
    elif(ruutu2.value == None):
        mita = u"hasRepresentationTerm"
        tagName = "uri"
        tiedo2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(tiedo2 == None):
            mita = u"hasAssociatedObjectClass"
            tiedo2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
            if(tiedo2 == None):
                tiedo2 = u'&nbsp;'
            else:
                index = tiedo2.rfind(u'#', 0, len(tiedo2))
                tiedo2 = tiedo2[index+1:]
                tiedo2 = u"<font class='blue'>"+tiedo2+u"</font>"
        else:
            index = tiedo2.rfind(u'#', 0, len(tiedo2))
            tiedo2 = tiedo2[index+1:]
            tiedo2 = u"<font class='blue'>"+tiedo2+u"</font>"
    
    sarake3 = otsikkoTarkistus(ws)
    if(sarake3 == -1 and sarake3laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Otsikko'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake3 = 7
        sarake3laskuri += 1
    elif(sarake3 == -1 and sarake3laskuri > 0):
        sarake3 = 7
    ruutu3 = ws.cell(row = rivi, column = sarake3)
    otsik = ruutu3.value
    if(ruutu3.value != None):
        otsik = str(otsik)
    elif(ruutu3.value == None):
        otsik2 = u'&nbsp;'

    sarake4 = dokumentaatioTarkistus(ws)
    if(sarake4 == -1 and sarake4laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Dokumentaatio'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake4 = 9
        sarake4laskuri += 1
    elif(sarake4 == -1 and sarake4laskuri > 0):
        sarake4 = 9
    ruutu4 = ws.cell(row = rivi, column = sarake4)
    dokum = ruutu4.value
    if(ruutu4.value != None):
        dokum = str(dokum)
    elif(ruutu4.value == None):
        dokum2 = u'&nbsp;'

    sarake5 = maaritelmaTarkistus(ws)
    if(sarake5 == -1 and sarake5laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Määritelmä'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake5 = 10
        sarake5laskuri += 1
    elif(sarake5 == -1 and sarake5laskuri > 0):
        sarake5 = 10
    ruutu5 = ws.cell(row = rivi, column = sarake5)
    maarite = ruutu5.value
    if(ruutu5.value != None):
        maarite = str(maarite)
    elif(ruutu5.value == None):
        mita = u"definition"
        tagName = "literal"
        maarite2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(maarite2 == None):
            maarite2 = u'&nbsp;'
        else:
            maarite2 = u"<font class='blue'>"+maarite2+u"</font>"

    sarake6 = huomautusTarkistus(ws)
    if(sarake6 == -1 and sarake6laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Huomautus'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake6 = 11
        sarake6laskuri += 1
    elif(sarake6 == -1 and sarake6laskuri > 0):
        sarake6 = 11
    ruutu6 = ws.cell(row = rivi, column = sarake6)
    huomau = ruutu6.value
    if(ruutu6.value != None):
        huomau = str(huomau)
    elif(ruutu6.value == None):
        mita = u"notice"
        tagName = "literal"
        huomau2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(huomau2 == None):
            huomau2 = u'&nbsp;'
        else:
            huomau2 = u"<font class='blue'>"+huomau2+u"</font>"

    sarake7 = esimerkkiTarkistus(ws)
    if(sarake7 == -1 and sarake7laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Esimerkki'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake7 = 12
        sarake7laskuri += 1
    elif(sarake7 == -1 and sarake7laskuri > 0):
        sarake7 = 12
    ruutu7 = ws.cell(row = rivi, column = sarake7)
    esime = ruutu7.value
    if(ruutu7.value != None):
        esime = str(esime)
    elif(ruutu7.value == None):
        mita = u"example"
        tagName = "literal"
        esime2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(esime2 == None):
            esime2 = u'&nbsp;'
        else:
            esime2 = u"<font class='blue'>"+esime2+u"</font>"

    sarake8 = koodistoTarkistus(ws)
    if(sarake8 == -1 and sarake8laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Koodisto'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake8 = 13
        sarake8laskuri += 1
    elif(sarake8 == -1 and sarake8laskuri > 0):
        sarake8 = 13
    ruutu8 = ws.cell(row = rivi, column = sarake8)
    koodis = ruutu8.value
    if(ruutu8.value != None):
        koodis = str(koodis)
    elif(ruutu8.value == None):
        koodis2 = u'&nbsp;'
            
    sarake9 = toistuvaTarkistus(ws)
    if(sarake9 == -1 and sarake9laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Toistuva'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake9 = 14
        sarake9laskuri += 1
    elif(sarake9 == -1 and sarake9laskuri > 0):
        sarake9 = 14
    ruutu9 = ws.cell(row = rivi, column = sarake9)
    toistu = ruutu9.value
    if(ruutu9.value != None):
        toistu = str(toistu)
    elif(ruutu9.value == None):
        mita = u"maxOccurs"
        tagName = "literal"
        toistu2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(toistu2 == None):
            toistu2 = u'&nbsp;'
        else:
            if(toistu2 == u"1"):
                toistu2 = u"ei"
                toistu2 = u"<font class='blue'>"+toistu2+u"</font>"
            elif(toistu2 == u"unbounded"):
                toistu2 = u"kyllä"
                toistu2 = u"<font class='blue'>"+toistu2+u"</font>"

    sarake10 = pakollinenTarkistus(ws)
    if(sarake10 == -1 and sarake10laskuri == 0):
        htmlLisays = (u"<h4 class='red'>Otsikkoa <b>'Pakollinen'</b>, ei löydy. Tarkista kirjoitusasu. Käytetään oletussaraketta.</h4>")
        validointi(htmlLisays, handle)
        sarake10 = 15
        sarake10laskuri += 1
    elif(sarake10 == -1 and sarake10laskuri > 0):
        sarake10 = 15
    ruutu10 = ws.cell(row = rivi, column = sarake10)
    pakol = ruutu10.value
    if(ruutu10.value != None):
        pakol = str(pakol)
    elif(ruutu10.value == None):
        mita = u"minOccurs"
        tagName = "literal"
        pakol2 = sisallonPaivitys(etsitaan, mista, mita, tagName)
        if(pakol2 == None):
            pakol2 = u'&nbsp;'
        else:
            if(pakol2 == u"0"):
                pakol2 = u"ei"
                pakol2 = u"<font class='blue'>"+pakol2+u"</font>"
            elif(pakol2 == u"1"):
                pakol2 = u"kyllä"
                pakol2 = u"<font class='blue'>"+pakol2+u"</font>"

    if(etsitaan == "Roolilistaus"):
        htmlLisays = (u"<tr class='headline1'>\n"
                      u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                      u"     <td class='title3' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else u'&nbsp;')+u"</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"</tr>")
        validointi(htmlLisays, handle)
    elif(etsitaan == "Asiakirjarakenteet"):
        htmlLisays = (u"<tr class='headline1'>\n"
                      u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                      u"     <td class='title3' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else u'&nbsp;')+u"</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"     <td>&nbsp;</td>\n"
                      u"</tr>")
        validointi(htmlLisays, handle)
    else:
        if(mista == None):
    ##        try:
                if(etsitaan != None):
                    if((etsitaan in kysymysLista) == True):#Kysymyksien tulee olla versiohistorian alapuolella. Jos näin ei ole, ohjelma antaa siitä virheilmoituksen.
                        htmlLisays = (u"<h4 class='red'>Siirrä kysymykset versiohistorian alapuolelle!</h4>")
                        validointi(htmlLisays, handle)
                    ruutu3 = valinPoisto(ruutu2.value)
                    if(ruutu2.value != None and (ruutu3 in ohitettavatLista) == False  and (u"llekirjoitu" in etsitaan) == False):
                        if(sparqlQuery(tiedesitmuoto, mista, rivi, handle) == True):
                                htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                               u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                               u"     <td class='title1' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else u'&nbsp;')+u"</td>\n"
                                               u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                               u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                               u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                               u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                               u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                               u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                               u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                               u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                               u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                               u"</tr>")
                                validointi(htmlLisays, handle)
                                varilaskuri += 1
                        elif(sparqlQuery(tiedesitmuoto, mista, rivi, handle) == False):
                                htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                               u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                               u"     <td class='title1red' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else u'')+u"</td>\n"
                                               u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                               u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                               u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                               u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                               u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                               u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                               u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                               u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                               u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                               u"</tr>")
                                validointi(htmlLisays, handle)
                                varilaskuri += 1
                    elif(ruutu2.value == None and (etsitaan in ohitettavatLista) == False  and (u"llekirjoitu" in etsitaan) == False):
                        if(sparqlQuery(etsitaan, mista, rivi, handle) == True):
                                htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                               u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                               u"     <td class='title1' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                               u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                               u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                               u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                               u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                               u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                               u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                               u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                               u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                               u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                               u"</tr>")
                                validointi(htmlLisays, handle)
                                varilaskuri += 1
                        elif(sparqlQuery(etsitaan, mista, rivi, handle) == False):
                                    htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                                   u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                                   u"     <td class='title1red' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                                   u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                                   u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                                   u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                                   u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                                   u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                                   u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                                   u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                                   u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                                   u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                                   u"</tr>")
                                    validointi(htmlLisays, handle)
                                    varilaskuri += 1
                    else:
                        if(ruutu2.value != None):
                            tem = ruutu2.value
                            tem = str(tem)
                            tem = unicode(tem)
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td class='titlegray' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        else:
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td class='titlegray' nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
    
    ##        except TypeError:
    ##            htmlLisays = (u"<h4 class='red'>Rivillä: "+str(rivi+1)+", Havaittu virhe tutkittaessa taulukkoa!</h4>")
    ##            validointi(htmlLisays, handle)
        else:
    ##        try:
                if((mista in ohitettavatLista) == False and (u"llekirjoitu" in mista) == False):
                    if(sparqlQuery(etsitaan, mista, rivi, handle) == True):
                        if(sarake == 0):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 1):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap COLSPAN='6'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 2):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap COLSPAN='5'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 3):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap COLSPAN='4'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 4):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap COLSPAN='3'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 5):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap COLSPAN='2'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 6):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td nowrap>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                   
                    elif(sparqlQuery(etsitaan, mista, rivi, handle) == False):
                        if(sarake == 0):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td class ='contentred nowrap COLSPAN='7'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 1):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class ='contentred' nowrap COLSPAN='6'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 2):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class='contentred' nowrap COLSPAN='5'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 3):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class='contentred' nowrap COLSPAN='4'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 4):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class='contentred' nowrap COLSPAN='3'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 5):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class='contentred' nowrap COLSPAN='2'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
                        elif(sarake == 6):
                            htmlLisays = ((u"<tr>" if (varilaskuri % 2 == 0) == True else u"<tr class='odd'>")+u"\n"
                                           u"     <td align='right'>"+str(rivi+1)+u"</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>\n"
                                           u"     <td class='contentred' nowrap COLSPAN='1'>"+(etsitaan if etsitaan != None else '&nbsp;')+u"</td>\n"
                                           u"     <td>"+(otsik if otsik != None else otsik2)+u"</td>\n"
                                           u"     <td>"+(tiedo if tiedo != None else tiedo2)+u"</td>\n"
                                           u"     <td>"+(dokum if dokum != None else dokum2)+u"</td>\n"
                                           u"     <td>"+(maarite if maarite != None else maarite2)+u"</td>\n"
                                           u"     <td>"+(huomau if huomau != None else huomau2)+u"</td>\n"
                                           u"     <td>"+(esime if esime != None else esime2)+u"</td>\n"
                                           u"     <td>"+(koodis if koodis != None else koodis2)+u"</td>\n"
                                           u"     <td>"+(toistu if toistu != None else toistu2)+u"</td>\n"
                                           u"     <td>"+(pakol if pakol != None else pakol2)+u"</td>\n"
                                           u"</tr>")
                            validointi(htmlLisays, handle)
                            varilaskuri += 1
    ##        except TypeError:
    ##            htmlLisays = (u"<h4 class='red'>Rivillä: "+str(rivi+1)+", Havaittu virhe tutkittaessa taulukkoa!</h4>")
    ##            validointi(htmlLisays, handle)
                            
##Hakee taulukkoon tyhjien kenttien sisällön.
def sisallonPaivitys(etsitaan, mista, mita, tagName):
    try:
        etsitaan = sanaMuunnos(etsitaan)#Muuntaa annetun sanan ääkköset unicode-koodiksi.
        mista = sanaMuunnos(mista)
    except:
        htmlLisays = (u"<h4 class='red'>Rivillä: "+str(rivi+1)+u", Havaittu virhe muutettaessa etsittavän kentän arvoa.</h4>")
        validointi(htmlLisays, handle)

    if(mista == None and (type(etsitaan) is float) == False):
        queryString = u"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        select ?"+mita+u" WHERE { \
                        ?any rdfs:label '"+etsitaan+u"'^^xsd:string . \
                        ?any rdf:type ccts:ABIE . \
                        ?any ccts:"+mita+u" ?"+mita+u" }"

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(tagName):
           child = elem.firstChild
           return child.nodeValue

    elif((type(etsitaan) is float) == False and mista != None and onkoASBIE(etsitaan, mista) == True):
        queryString = u"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        select ?"+mita+u" WHERE { \
                        ?any rdfs:label '"+etsitaan+u"'^^xsd:string . \
                        ?any rdf:type ccts:ASBIE . \
                        ?any ccts:"+mita+u" ?"+mita+u" }"

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(tagName):
           child = elem.firstChild
           return child.nodeValue
        
    elif((type(etsitaan) is float) == False and onkoLuokka(mista) == True and mista != None and etsitaan != None):
        queryString = u"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        select ?"+mita+u" WHERE { \
                        ?any rdfs:label '"+mista+u"'^^xsd:string . \
                        ?any rdf:type ccts:ABIE . \
                        ?any ccts:hasObjectClassTerm ?oTerm . \
                        ?bbie ccts:hasObjectClassTerm ?oTerm . \
                        ?bbie rdf:type ccts:BBIE . \
                        ?bbie rdfs:label '"+etsitaan+u"'^^xsd:string . \
                        ?bbie ccts:"+mita+u" ?"+mita+u" }"

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(tagName):
           child = elem.firstChild
           return child.nodeValue
        
    elif(mista != None and etsitaan != None and (type(etsitaan) is float) == False):
        queryString = u"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        select ?"+mita+u" WHERE { \
                        ?any rdfs:label '"+mista+u"'^^xsd:string . \
                        ?any rdf:type ccts:ASBIE . \
                        ?any ccts:hasAssociatedObjectClass ?aClass . \
                        ?bbie ccts:hasObjectClassTerm ?aClass . \
                        ?bbie rdf:type ccts:BBIE . \
                        ?bbie rdfs:label '"+etsitaan+u"'^^xsd:string . \
                        ?bbie ccts:"+mita+u" ?"+mita+u" }"

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(tagName):
           child = elem.firstChild
           return child.nodeValue

def onkoASBIE(etsitaan, mista):
    if(etsitaan == None or mista == None):
        return False

    etsitaan = valinPoisto(etsitaan)#Poistaa ylimääräiset välilyönnit.
    etsitaan = sanaMuunnos(etsitaan)#Muuntaa annetun sanan ääkköset unicode-koodiksi.
    mista = valinPoisto(mista)#Poistaa ylimääräiset välilyönnit.
    mista = sanaMuunnos(mista)#Muuntaa annetun sanan ääkköset unicode-koodiksi.
        
    if((type(etsitaan) is float) == False):
        queryString = u"PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        ASK { ?a ccts:hasObjectClassTerm ?upper . \
                        ?upper rdfs:label ?mista . \
                        ?a rdf:type ccts:ASBIE . ?a rdfs:label ?str . FILTER (?str = '"+etsitaan+u"') \
                        FILTER (?mista = '"+mista+u"')}"

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(u'boolean'):
            child = elem.firstChild
            if child:
                if(child.nodeValue == u"true"):
                    return True
                else:
                    return False

##Tutkii mistä sarakkeesta löytyy "Otsikko"-teksti.
def otsikkoTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Otsikko"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Tiedon esitysmuoto"-teksti.
def tiedonEsitysmuotoTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Tiedon esitysmuoto"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Dokumentaatio"-teksti.
def dokumentaatioTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Dokumentaatio"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Määritelmä"-teksti.
def maaritelmaTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Määritelmä"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Huomautus"-teksti.
def huomautusTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Huomautus"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Esimerkki"-teksti.
def esimerkkiTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Esimerkki"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Koodisto"-teksti.
def koodistoTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Koodisto"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Toistuva"-teksti.
def toistuvaTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Toistuva"
    ruutu = ws.cell(row = rivi, column = sarake)

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1
    
    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Tutkii mistä sarakkeesta löytyy "Pakollinen"-teksti.
def pakollinenTarkistus(ws):
    sarake = 0
    rivi = 1
    lopetus = u"Pakollinen"
    ruutu = ws.cell(row = rivi, column = sarake)
    oletus = 15

    while(ruutu.value != lopetus and rivi < 10):
        ruutu = ws.cell(row = rivi, column = sarake)
        sarake +=1
        if(sarake >= 30):
            sarake = 0
            rivi += 1

    if(rivi >= 10):
        return -1
    else:
        sarake -= 1
        return sarake

##Etsii taulukosta määrätyillä arvoilla viimeisen rivin
def viimeinenRiviTaulukossa(ws, handle):
    rivi = 0
    etsittava = u"Versiohistoria"
    etsittava2 = u"Versiohistoria:"

    try:
        while(ws.cell(row = rivi, column = 0).value != etsittava and ws.cell(row = rivi, column = 0).value != etsittava2):
            rivi += 1
            if(rivi >= 1000):
                htmlLisays = (u"<h4 class='red'>Havaittu virhe tutkittaessa taulukkoa! Versiohistoria-kenttää ei löydy.</h4>\n"
                              u"<h4 class='red'>Jos versiohistoria-teksti näkyy taulukossa, tarkista kirjoitusasu! Versiohistoria. tai Versiohistoria .</h4>")
                validointi(htmlLisays, handle)
                raise ValueError
    except ValueError:
        rivi = 0
        try:
            while((type(ws.cell(row = rivi, column = 0).value) is float) == False):
                rivi += 1
                if(rivi >= 1000):
                    htmlLisays = (u"<h4 class='red'>Havaittu virhe tutkittaessa taulukkoa! Versiohistorian numerointia ei löytynyt ensimmäisestä sarakkeesta.</h4>")
                    validointi(htmlLisays, handle)
                    raise TypeError
        except TypeError:
            rivi = 0
            try:
                while((type(ws.cell(row = rivi, column = 1).value) is float) == False):
                    rivi += 1
                    if(rivi >= 1000):
                        raise NameError
            except NameError:
                htmlLisays = (u"<h4 class='red'>Havaittu virhe tutkittaessa taulukkoa! Versiohistorian numerointia ei löydy.</h4>")
                validointi(htmlLisays, handle)

    tiedonesitysmuoto = tiedonEsitysmuotoTarkistus(ws)
    tyhjarivi = True
    while(tyhjarivi == True):
        rivi -= 1
        sarake = 0
        for sarake in range(0, tiedonesitysmuoto):
            if(ws.cell(row = rivi, column = sarake).value != None):
                tyhjarivi = False
    return rivi

##Tarkistaa onko annettu kenttä luokka
def onkoLuokka(etsitaan):
    if((type(etsitaan) is float) == False):
        queryString = u'PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        ASK { ?a rdf:type ccts:ABIE . ?a rdfs:label ?str . FILTER (?str = "'+etsitaan+u'")}'

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        for elem in results.getElementsByTagName(u'boolean'):
            child = elem.firstChild
            if child:
                if(child.nodeValue == u"true"):
                    return True
                else:
                    return False

##Sparql-kysely
def sparqlQuery(etsitaan, mista, rivi, handle):
    if(etsitaan != None):
        etsitaan = valinPoisto(etsitaan)#Poistaa ylimääräiset välit alusta, lopusta ja keskeltä. Esim. " matti  ja teppo " => "matti ja teppo"
    if(mista != None):
        mista = valinPoisto(mista)
    try:
        etsitaan = sanaMuunnos(etsitaan)#Muuntaa annetun sanan ääkköset unicode-koodiksi.
        mista = sanaMuunnos(mista)
    except:
        htmlLisays = (u"<h4 class='red'>Rivillä: "+str(rivi+1)+u", Havaittu virhe muutettaessa etsittavän kentän arvoa.</h4>")
        validointi(htmlLisays, handle)

    if(mista == None):
        return onkoLuokka(etsitaan)

    elif(mista != None and etsitaan != None and (type(etsitaan) is float) == False):
        queryString = u'PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        ASK { \
                        ?a rdf:type ccts:ABIE . ?a rdfs:label ?alabel . \
                        ?b rdfs:label ?blabel . ?b ccts:hasObjectClassTerm ?a . \
                        FILTER (?alabel = "'+mista+u'") \
                        FILTER (?blabel = "'+etsitaan+u'")}'

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        elem = results.getElementsByTagName(u'boolean')[0]
        child = elem.firstChild
        if child:
            if(child.nodeValue == u"true"):
                return True
            else:
                return varmistusQuery(etsitaan, mista)
##                return False

    elif(etsitaan == None and mista == None):
        return False

##Jos ensimmäinen query palauttaa falsen, varmistusmetodi tekee uuden kyselyn, missä haetaan urin perusteella
def varmistusQuery(etsitaan, mista):
    oClass = ""
    queryString = u"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                    PREFIX ccts: <http://tikesos.fi/ccts#> \
                    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \
                    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                    select ?class WHERE { \
                    ?any rdfs:label '"+mista+"'^^xsd:string . \
                    ?any ccts:hasAssociatedObjectClass ?class }"

    sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

    sparql.setQuery(queryString)
    sparql.setMethod(POST)
    sparql.setReturnFormat(XML)
    results = sparql.query().convert()

    for elem in results.getElementsByTagName(u'uri'):
        child = elem.firstChild
        oClass = child.nodeValue

    if(oClass != ""):
        queryString = u'PREFIX ccts: <http://tikesos.fi/ccts#> \
                        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \
                        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \
                        ASK { \
                        ?b rdfs:label ?blabel . ?b ccts:hasObjectClassTerm <'+oClass+'> . \
                        ?b ccts:hasPropertyTerm ?any \
                        FILTER (?blabel = "'+etsitaan+'")}'

        sparql = SPARQLWrapper(u"http://sosmeta.fi:8080/openrdf-sesame/repositories/sosmeta")

        sparql.setQuery(queryString)
        sparql.setMethod(POST)
        sparql.setReturnFormat(XML)
        results = sparql.query().convert()

        elem = results.getElementsByTagName(u'boolean')[0]
        child = elem.firstChild
        if child:
            if(child.nodeValue == u"true"):
                return True
            else:
                return False
    else:
        return False

##Muuntaa annetun sanan ääkköset unicode-koodiksi
def sanaMuunnos(string):
    if(string != None):
        string = string.replace(u'ä', '\u00E4')
        string = string.replace(u'Ä', '\u00C4')
        string = string.replace(u'ö', '\u00F6')
        string = string.replace(u'Ö', '\u00D6')
        return string

##poistaa ylimääräiset välit
def valinPoisto(string):
    if(string != None):
        muunnettu = u""
        taulu = string.split()
        for i in range(0, len(taulu)):
            muunnettu += taulu[i]+u" "
        string = muunnettu.strip()
    return unicode(string)

#Metodi joka käynnistyy säikeen suorittamisen jälkeen. Metodi pysäyttää progressbarin ja palauttaa lukitut painikkeet
def callback():
    progBar.stop()
    kaynnistaSarviNappi.configure(state=NORMAL)
    suljenappi.configure(state=NORMAL)
    pbnappi.configure(state=NORMAL)

#Käynnistää avaaTiedosto-metodin, käynnistää progressbarin ja lukitsee painikkeet
def on_button():
    avaatiedosto = avaaTiedosto()
    ohjelmaLoppuu = avaatiedosto["ohjelmaLoppuu"]
    if(ohjelmaLoppuu == False):
        pbikkuna.deiconify()
        progBar.start()
        kaynnistaSarviNappi.configure(state=DISABLED)
        suljenappi.configure(state=DISABLED)
        pbnappi.configure(state=DISABLED)
        thd = Thread(progtest, callback)
        thd.start()

#Avaa tiedoston
def avaaTiedosto():
    global d
    ohjelmaLoppuu = False
    ikkuna = Tkinter.Tk() #Luo graafisen käyttöliittymän ikkunan
    ikkuna.withdraw()  #Piilottaa ikkunan
    d = fd.askopenfilenames(title=u"Avaa tiedosto", filetypes=[("Microsoft Office Excel 2007","xlsx"),("Microsoft Office Excel 97 - 2003","xls")]) #Näyttää "avaa-tiedosto"-ikkunan
    if(d == None or d == u""): #Jos "avaa-tiedosto"-ikkunassa painaa näppäintä "Cancel"("Peruuta"), ohjelma loppuu
        ohjelmaLoppuu = True
    d = str(d)
    d = ikkuna.tk.splitlist(d)
    ikkuna.destroy() #Sulkee ikkunan
    return {"ohjelmaLoppuu" : ohjelmaLoppuu, "tiedosto" : d}

#Pääikkuna:
root = Tk()
Style().configure(style=u'winnative')
root.title(u'SARVI-Validointipalvelu')
label = Label(text = u"Sarvi-Validointipalvelu", font = u"18")
label.pack()
kaynnistaSarviNappi = Button(text= u'Käynnistä S.A.R.V.I', command=on_button)
kaynnistaSarviNappi.pack()
suljenappi = Button(text = u"Sulje ohjelma", command = root.destroy)#destroy/quit ##, pbikkuna.destroy
suljenappi.pack()

#Progress Bar:
pbikkuna = Tk()
pbikkuna.withdraw()
Style().configure(style=u'winnative')
pbikkuna.title(u'Suoritus käynnissä')
progBar = Progressbar(pbikkuna, orient=HORIZONTAL, length=200, mode=u'indeterminate')
progBar.pack()
pbnappi = Button(pbikkuna, text=u"Valmis", command = pbikkuna.withdraw)
pbnappi.pack()

root.mainloop()
